package com.demarc.pesquisas.infraestrutura.mensagem;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;

import org.apache.commons.lang3.StringUtils;

import com.demarc.pesquisas.infraestrutura.excecao.NegocioException;
import com.demarc.pesquisas.infraestrutura.excecao.NegocioExceptionConverter;

public final class MensagemJsfUtils {

	private static final String SUFIXO_DETALHE = "_detail";

	private MensagemJsfUtils() {
		throw new UnsupportedOperationException();
	}

	public static void adicionarMensagemAdvertencia(Mensagem mensagem) {
		adicionarMensagemAdvertencia(MensagemUtil.get(mensagem));
	}

	private static void adicionarMensagemAdvertencia(String detalhe) {
		adicionarMensagem(FacesMessage.SEVERITY_WARN, "Advertência:", detalhe);
	}

	public static void adicionarMensagemInfo(Mensagem mensagem) {
		adicionarMensagemInfo(MensagemUtil.get(mensagem));
	}

	private static void adicionarMensagemInfo(String detalhe) {
		adicionarMensagem(FacesMessage.SEVERITY_INFO, "Info:", detalhe);
	}

	public static void adicionarMensagemErro(NegocioException excecao) {
		adicionarMensagemErro(NegocioExceptionConverter.getInstance()
				.getAsString(excecao));
	}

	public static void adicionarMensagemErro(Mensagem mensagem) {
		adicionarMensagemErro(MensagemUtil.get(mensagem));
	}

	public static void adicionarMensagemErro(String detalhe) {
		String novoDetalhe = getDetalheDoArquivoMensagens(detalhe);
		adicionarMensagem(FacesMessage.SEVERITY_ERROR, "Erro:", novoDetalhe);
	}

	/**
	 * Procura o detalhe no arquivo de mensagens.
	 * 
	 * @param detalhe
	 *            o texto que deseja procurar no arquivo de mensagens
	 * @return Caso o sistema encontre mensagem no arquivo de mensagens, retorna
	 *         a mensagem do arquivo. Caso contrário, retorna o próprio detalhe.
	 */
	private static String getDetalheDoArquivoMensagens(String detalhe) {
		// se o detalhe não tiver underline é porque não é do arquivo de
		// mensagens
		if (StringUtils.containsNone(detalhe, "_")) {
			return detalhe;
		}

		String novoDetalhe = null;
		try {
			novoDetalhe = MensagemUtil.get(detalhe);
		} catch (Exception ex) {
			novoDetalhe = detalhe;
		}

		return novoDetalhe;
	}

	private static void adicionarMensagemErro(String[] detalhes) {
		for (String detalhe : detalhes) {
			adicionarMensagemErro(detalhe);
		}
	}

	public static void adicionarMensagem(Severity severidade, String titulo,
			String detalhe) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(severidade, titulo, detalhe));
	}

	public static void adicionarMensagem(FacesMessage facesMessage) {
		FacesContext.getCurrentInstance().addMessage(null, facesMessage);
	}

	public static void adicionarMensagem(String clientId,
			FacesMessage facesMessage) {
		FacesContext.getCurrentInstance().addMessage(clientId, facesMessage);
	}

	/**
	 * Adiciona a mensagem de dados salvos com sucesso na página que será
	 * exibida.
	 */
	public static void adicionarMensagemOperacaoSucesso() {
		adicionarMensagemInfo(new Mensagem("Operação Realizada com Sucesso"));
	}

	public static FacesMessage criarFacesMessage(Severity severidade,
			String messageId, Object... parametros) {
		String titulo = MensagemUtil.get(messageId, parametros);
		String detalhe = MensagemUtil.get(messageId + SUFIXO_DETALHE,
				parametros);
		if (StringUtils.isBlank(detalhe)) {
			detalhe = titulo;
		}
		return new FacesMessage(severidade, titulo, detalhe);
	}
}
